跳到主要内容

Go 里面的引用类型

Golang 引用类型面试问题整理

1. 基础概念考察

Q1: Go 语言中有哪些引用类型?它们与值类型有什么区别?

考察要点:

  • 引用类型:slice, map, channel, interface, function, pointer
  • 值类型在赋值时会复制整个值
  • 引用类型在赋值时只复制引用,底层数据共享

2. 切片(Slice)深度考察

Q2: 请解释 slice 的底层结构,以下代码的输出是什么?为什么?

func main() {
s1 := []int{1, 2, 3}
s2 := s1
s2[0] = 100
fmt.Println(s1, s2)

s2 = append(s2, 4, 5, 6, 7)
s2[1] = 200
fmt.Println(s1, s2)
}

Q3: 什么情况下 slice 会发生扩容?扩容规则是什么?

3. 映射(Map)考察

Q4: 以下代码有什么问题?如何修复?

func main() {
var m map[string]int
m["key"] = 1 // 这里会发生什么?

// 并发场景
go func() {
m["key1"] = 1
}()
go func() {
m["key2"] = 2
}()
}

Q5: Map 的底层实现原理是什么?

4. 通道(Channel)考察

Q6: 以下代码会发生什么?如何避免?

func main() {
ch := make(chan int)
ch <- 1 // 这里会怎样?

// 场景2
ch2 := make(chan int)
close(ch2)
ch2 <- 1 // 这里会怎样?

// 场景3
var ch3 chan int
ch3 <- 1 // 这里会怎样?
}

Q7: Channel 的不同状态下,各种操作的行为是什么?

5. 接口(Interface)考察

Q8: 以下代码输出什么?为什么?

func main() {
var i interface{}
var p *int
i = p
fmt.Println(i == nil) // 输出什么?

var s []int
i = s
fmt.Println(i == nil) // 输出什么?
}

6. 综合应用题

Q9: 实现一个线程安全的缓存,要求支持过期时间

Q10: 解释以下代码的内存分配情况

func createSlice() []int {
s := make([]int, 1000)
return s[:3]
}

7. 面试技巧提醒

  1. 回答结构化:先说概念,再举例子,最后说注意事项
  2. 主动提及陷阱:展示你对Go的深度理解
  3. 结合实际场景:说明在项目中如何应用
  4. 性能考虑:讨论内存分配和GC影响

这些问题覆盖了Go引用类型的核心概念,既有基础理论,也有实际应用,能够全面考察面试者的Go语言功底。